package br.com.dallas.util.validar;

import br.com.dallas.util.converter.Conversor;
import br.com.dallas.util.exception.NumeroFormatoInvalidoException;
import br.com.dallas.util.lang.StringUtil;

public final class ValidarCpf
{
	public static boolean isCPFValido(String cpfEntrada)
	{
		String cpfCalculo = StringUtil.getSomenteNumeros(cpfEntrada);
		if (cpfCalculo.length() != 11 || isSequenciaValidaCPF(cpfCalculo))
		{
			return false;
		}
		int resultadoPrimeiroDigito = getResultadoDigito(cpfCalculo, 9, 10);
		int resultadoSegundoDigito = getResultadoDigito(cpfCalculo, 10, 11);
		int primeiroDigito = 0, segundoDigito = 0;
		primeiroDigito = getResultadoDigitos(resultadoPrimeiroDigito);
		segundoDigito = getResultadoDigitos(resultadoSegundoDigito);
		if (isDigitoValido(primeiroDigito, segundoDigito, cpfCalculo))
		{
			return true;
		}
		return false;
	}

	private static boolean isSequenciaValidaCPF(String entrada)
	{
		for (int posicao = 0; posicao < entrada.length(); posicao++)
		{
			if (posicao < entrada.length() - 1)
			{
				String primerioComparador = String.valueOf(entrada
						.charAt(posicao));
				String segundoComparador = String.valueOf(entrada
						.charAt(posicao + 1));
				if (!primerioComparador.equals(segundoComparador))
				{
					return false;
				}
			}
		}
		return true;
	}

	private static int getResultadoDigito(String cpfCalculo,
			int quantidadeDigitosParaCalculo, int numeroCalculo)
	{
		int retornoDigitos = 0;
		for (int posicao = 0; posicao < quantidadeDigitosParaCalculo; posicao++, numeroCalculo--)
		{
			try
			{
				int digitoParaCalculo = Conversor.getStringParaInt(String
						.valueOf(cpfCalculo.charAt(posicao)));
				int resultadoCalculoDoDigito = digitoParaCalculo
						* numeroCalculo;
				retornoDigitos = retornoDigitos + resultadoCalculoDoDigito;
			}
			catch (NumeroFormatoInvalidoException e)
			{
				e.printStackTrace();
			}
		}
		return retornoDigitos;
	}

	private static int getResultadoDigitos(int valorDigitos)
	{
		int retornoDigitos = 0;
		if (valorDigitos % 11 <= 1)
		{
			retornoDigitos = 0;
		}
		else
		{
			retornoDigitos = 11 - (valorDigitos % 11);
		}
		return retornoDigitos;
	}

	private static boolean isDigitoValido(int digitoEntradaHum,
			int digitoEntradaDois, String cpfComparacao)
	{
		try
		{
			String primeiraComparacao = String.valueOf(cpfComparacao.charAt(9));
			String segundaComparacao = String.valueOf(cpfComparacao.charAt(10));
			if (digitoEntradaHum == Conversor
					.getStringParaInt(primeiraComparacao)
					&& digitoEntradaDois == Conversor
							.getStringParaInt(segundaComparacao))
			{
				return true;
			}
		}
		catch (NumeroFormatoInvalidoException e)
		{
			e.printStackTrace();
		}
		return false;
	}
}
